package com.xxl.job.admin.service;

import com.xxl.job.admin.core.model.XxlJobUser;
import com.xxl.job.admin.core.util.CookieUtil;
import com.xxl.job.admin.core.util.I18nUtil;
import com.xxl.job.admin.core.util.JacksonUtil;
import com.xxl.job.admin.dao.XxlJobUserDao;
import com.xxl.job.core.biz.model.ReturnT;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.DigestUtils;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.math.BigInteger;

/**
 * @author xuxueli 2019-05-04 22:13:264
 */
@Configuration
public class LoginService {

  public static final String LOGIN_IDENTITY_KEY = "XXL_JOB_LOGIN_IDENTITY";

  @Resource
  private XxlJobUserDao xxlJobUserDao;


  private String makeToken(XxlJobUser xxlJobUser) {
    String tokenJson = JacksonUtil.writeValueAsString(xxlJobUser);
    String tokenHex = new BigInteger(tokenJson.getBytes()).toString(16);
    return tokenHex;
  }

  private XxlJobUser parseToken(String tokenHex) {
    XxlJobUser xxlJobUser = null;
    if (tokenHex != null) {
      String tokenJson = new String(
          new BigInteger(tokenHex, 16).toByteArray());      // username_password(md5)
      xxlJobUser = JacksonUtil.readValue(tokenJson, XxlJobUser.class);
    }
    return xxlJobUser;
  }


  public ReturnT<String> login(HttpServletRequest request, HttpServletResponse response,
      String username, String password, boolean ifRemember) {

    // param
    if (username == null || username.trim().length() == 0 || password == null
        || password.trim().length() == 0) {
      return new ReturnT<String>(500, I18nUtil.getString("login_param_empty"));
    }

    // valid passowrd
    XxlJobUser xxlJobUser = xxlJobUserDao.loadByUserName(username);
    if (xxlJobUser == null) {
      return new ReturnT<String>(500, I18nUtil.getString("login_param_unvalid"));
    }
    String passwordMd5 = DigestUtils.md5DigestAsHex(password.getBytes());
    if (!passwordMd5.equals(xxlJobUser.getPassword())) {
      return new ReturnT<String>(500, I18nUtil.getString("login_param_unvalid"));
    }

    String loginToken = makeToken(xxlJobUser);

    // do login
    CookieUtil.set(response, LOGIN_IDENTITY_KEY, loginToken, ifRemember);
    return ReturnT.SUCCESS;
  }

  /**
   * logout
   *
   * @param request
   * @param response
   */
  public ReturnT<String> logout(HttpServletRequest request, HttpServletResponse response) {
    CookieUtil.remove(request, response, LOGIN_IDENTITY_KEY);
    return ReturnT.SUCCESS;
  }

  /**
   * logout
   *
   * @param request
   * @return
   */
  public XxlJobUser ifLogin(HttpServletRequest request, HttpServletResponse response) {
    String cookieToken = CookieUtil.getValue(request, LOGIN_IDENTITY_KEY);
    if (cookieToken != null) {
      XxlJobUser cookieUser = null;
      try {
        cookieUser = parseToken(cookieToken);
      } catch (Exception e) {
        logout(request, response);
      }
      if (cookieUser != null) {
        XxlJobUser dbUser = xxlJobUserDao.loadByUserName(cookieUser.getUsername());
        if (dbUser != null) {
          if (cookieUser.getPassword().equals(dbUser.getPassword())) {
            return dbUser;
          }
        }
      }
    }
    return null;
  }


}
